package com.wusiwei.service;

import com.wusiwei.common.PageResult;
import com.wusiwei.common.Result;
import com.wusiwei.dto.MatchQueryDTO;
import com.wusiwei.entity.Invoice;
import com.wusiwei.entity.Order;
import com.wusiwei.entity.Receipt;
import com.wusiwei.entity.ThreeWayMatch;
import com.wusiwei.vo.MatchResult;
import com.wusiwei.vo.MatchStatisticsData;
import com.wusiwei.vo.MatchedOrderVO;

import java.util.List;
import java.util.Map;

/**
 * 三单匹配服务接口
 */
public interface MatchService {

    /**
     * 新增三单匹配记录
     *
     * @param match 三单匹配对象
     * @return 操作结果
     */
    Result<ThreeWayMatch> add(ThreeWayMatch match);

    /**
     * 更新三单匹配记录
     *
     * @param match 三单匹配对象
     * @return 操作结果
     */
    Result<ThreeWayMatch> update(ThreeWayMatch match);

    /**
     * 删除三单匹配记录
     *
     * @param id 匹配记录ID
     * @return 操作结果
     */
    Result<Void> delete(Long id);

    /**
     * 根据ID查询三单匹配记录
     *
     * @param id 匹配记录ID
     * @return 三单匹配对象
     */
    Result<ThreeWayMatch> findById(Long id);

    /**
     * 查询所有三单匹配记录
     *
     * @return 三单匹配记录列表
     */
    Result<List<ThreeWayMatch>> findAll();

//    /**
//     * 根据条件查询三单匹配记录
//     *
//     * @param match 查询条件
//     * @return 三单匹配记录列表
//     */
//    Result<List<ThreeWayMatch>> findByCondition(ThreeWayMatch match);
//
//    /**
//     * 根据条件Map查询三单匹配记录
//     *
//     * @param condition 查询条件Map
//     * @return 三单匹配记录列表
//     */
//    List<ThreeWayMatch> findByConditionMap(Map<String, Object> condition);
//
//    /**
//     * 根据日期范围查询三单匹配记录
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 三单匹配记录列表
//     */
//    Result<List<ThreeWayMatch>> findByDateRange(LocalDate startDate, LocalDate endDate);
//
//    /**
//     * 执行三单匹配
//     *
//     * @param order   订单
//     * @param receipt 收货单
//     * @param invoice 发票
//     * @return 匹配结果
//     */
//    Result<ThreeWayMatch> match(Order order, Receipt receipt, Invoice invoice);

    /**
     * 获取匹配统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getMatchStatistics();

    /**
     * 获取匹配统计数据
     *
     * @param params 查询参数
     * @return 统计数据对象
     */
    MatchStatisticsData getMatchStatistics(MatchQueryDTO params);

//    /**
//     * 分页查询三单匹配记录
//     *
//     * @param pageRequest 分页请求
//     * @return 分页结果
//     */
//    PageResult<ThreeWayMatch> page(PageRequest pageRequest);
//
//    /**
//     * 按日期统计三单匹配记录
//     *
//     * @param startDate 开始日期
//     * @param endDate 结束日期
//     * @return 日期统计结果
//     */
//    List<Map<String, Object>> getMatchDateStats(String startDate, String endDate);

    /**
     * 统计总记录数
     *
     * @return 总记录数
     */
    int countTotal();

//    /**
//     * 按匹配结果分组统计
//     *
//     * @return 统计结果列表
//     */
//    List<Map<String, Object>> countByMatchResult();
//
//    /**
//     * 按供应商统计匹配准确率
//     *
//     * @return 统计结果列表
//     */
//    List<Map<String, Object>> countMatchRateBySupplier();
//
//    /**
//     * 按月统计匹配趋势
//     *
//     * @return 统计结果列表
//     */
//    List<Map<String, Object>> countMatchTrendByMonth();

    /**
     * 执行三单匹配
     *
     * @param orderId   订单ID
     * @param receiptId 收货单ID
     * @param invoiceId 发票ID
     * @return 匹配结果
     */
    MatchResult matchThreeDocuments(Long orderId, Long receiptId, Long invoiceId);

    /**
     * 分页查询匹配记录
     *
     * @param pageNum      页码
     * @param pageSize     每页大小
     * @param supplierName 供应商名称
     * @param matchResult  匹配结果
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 匹配记录分页结果
     */
    Object getMatchPage(int pageNum, int pageSize, String supplierName,
                        String matchResult, String startDate, String endDate);

    /**
     * 导出匹配记录
     *
     * @param supplierName 供应商名称
     * @param matchResult  匹配结果
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 导出的文件二进制数据
     */
    byte[] exportMatches(String supplierName, String matchResult,
                         String startDate, String endDate);

    /**
     * 执行全局自动匹配
     * 自动查找未匹配的订单、收货单和发票并尝试进行匹配
     *
     * @return 匹配结果列表
     */
    List<MatchResult> performGlobalMatch();

    /**
     * 获取可三单匹配的订单列表
     *
     * @param pageNum      页码
     * @param pageSize     每页大小
     * @param supplierName 供应商名称
     * @param orderNumber  订单编号
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 订单分页结果
     */
    PageResult<Order> getOrdersAvailableForMatch(int pageNum, int pageSize, String supplierName,
                                                 String orderNumber, String startDate, String endDate);

    /**
     * 获取已完成三单匹配的订单列表
     *
     * @param pageNum      页码
     * @param pageSize     每页大小
     * @param supplierName 供应商名称
     * @param orderNumber  订单编号
     * @param matchResult  匹配结果
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 已匹配订单分页结果
     */
    PageResult<MatchedOrderVO> getMatchedOrders(int pageNum, int pageSize, String supplierName,
                                                String orderNumber, String matchResult, String startDate, String endDate);

    /**
     * 获取可与指定订单匹配的收货单列表
     *
     * @param orderId 订单ID
     * @return 可匹配的收货单列表
     */
    List<Receipt> getReceiptsForOrderMatch(Long orderId);

    /**
     * 获取可与指定订单匹配的发票列表
     *
     * @param orderId 订单ID
     * @return 可匹配的发票列表
     */
    List<Invoice> getInvoicesForOrderMatch(Long orderId);

    /**
     * 批量删除匹配记录
     *
     * @param ids 匹配记录ID列表
     * @return 是否删除成功
     */
    boolean batchDelete(List<Long> ids);

    /**
     * 根据单号自动匹配
     *
     * @param orderCode   订单号
     * @param receiptCode 收货单号
     * @param invoiceCode 发票号
     * @return 匹配结果
     */
    MatchResult autoMatchByCode(String orderCode, String receiptCode, String invoiceCode);

    /**
     * 根据发票ID获取关联的订单列表
     *
     * @param invoiceId 发票ID
     * @return 关联的订单列表
     */
    List<Order> getOrdersByInvoiceId(Long invoiceId);
} 